package com.rw.coco.service;

import com.rw.coco.api.data.PersistenceMapper;
import com.rw.coco.api.data.model.AccountModel;
import com.rw.coco.api.modle.Account;
import com.rw.coco.handler.message.event.CocoMessageEvent;
import com.rw.coco.util.TransactionUtil;
import com.rw.tool.util.string.StringUtil;

/**
 * 用户的一些操作
 */
public class AccountService extends BaseService {
    public AccountService(PersistenceMapper mapper) {
        super(mapper);
    }

    public AccountService(CocoMessageEvent cocoMessageEvent) {
        super(cocoMessageEvent);
    }

    /**
     * 查询用户，如果库中没有用户，则要把默认的用户加入数据库
     * 这一步要保证后续在查询数据库时，根据ID能够查询出用户的基础信息（如 realName
     * 它需要存在于各个入口，以保证操作用户都能够入库
     * 后续查询用户时，才能够使用get方法直接获取用户
     * <p>
     * 但是除了操作用户之外，还有一个用户来源，那就是黑白名单
     * 黑白名单会带来空壳用户，空壳用户没有基础信息
     * 为了防止空壳用户带来的影响，必须在每次查询出用户之后，查看是否拥有基础信息
     * 如果没有，代表其为空壳用户，及时补上对应的信息
     *
     * @param account 用户
     * @return 查询出来的用户
     */
    public AccountModel getOrDefaultAccount(Account account) {
        return TransactionUtil.runWithResult(transactionSwitch, () -> getAccount(account));
    }

    private AccountModel getAccount(Account account) {
        // 查找用户，如果没有，则使用默认的，并把默认用户入库
        AccountModel defaultModel = AccountModel.getDefault(account.getId(), account.getRealName());
        AccountModel accountModel = accountMapper.getAccountOrPut(account.getId(), defaultModel);
        // 如果发现realName没有入库，则把用户的realName变更，这一步主要是去除黑名单带来的空壳用户
        if (!StringUtil.equals(accountModel.getRealName(), account.getRealName())) {
            accountMapper.setRealName(account.getId(), account.getRealName());
            accountModel.setRealName(account.getRealName());
        }
        return accountModel;
    }
}
